package effectiveJava.Reference;

import org.junit.Test;

import java.lang.ref.Reference;
import java.lang.ref.SoftReference;

/**
 * Created by dycong on 2017/7/23.
 */
public class Soft {

    /**
     * 软引用使用 get() 方法取得对象的强引用从而访问目标对象。
     * 软引用所指向的对象按照 JVM 的使用情况（Heap 内存是否临近阈值）来决定是否回收。
     * 软引用可以避免 Heap 内存不足所导致的异常。
     *
     * @throws Exception
     */
    @Test
    public void test() throws Exception {
        SoftReference<ObjectForTest> bean = new SoftReference<ObjectForTest>(new ObjectForTest());
        ObjectForTest reference = bean.get();
        reference.setName("test");
        reference.setWeight(2);
        reference = null;           //此处不设为null则会转为强引用
        System.gc();
        Thread.sleep(1000l);
        System.gc();
        System.out.println(bean.get());
    }
    // TODO: 2017/7/23 如果想使用这些相对强引用来说较弱的引用来进行对象操作的时候，就必须保证没有强引用指向被操作对象。否则将会被视为强引用指向，不会具有任何的弱引用的特性。
    @Test
    public void test1(){
        Reference<ObjectForTest>[] arrays = new SoftReference[10000000];
        for (int i = 0;i<arrays.length;i++){
            arrays[i]=new SoftReference<ObjectForTest>(new ObjectForTest("test",1));
        }
        System.out.println(arrays[1].get());
    }

}
